package com.bingxue.edu.framework.enums;

import cn.hutool.core.util.ClassUtil;
import com.bingxue.edu.Application;
import com.bingxue.edu.framework.common.model.LabelValue;
import lombok.Getter;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;

/**
 * 字典枚举工具类
 * @author panbo
 * @since 2024/7/8
 */
@SuppressWarnings({"rawtypes", "unchecked"})
public class DictEnums {

    @Getter
    private static final Set<Class<?>> enumClassSet = ClassUtil.scanPackageBySuper(ClassUtil.getPackage(Application.class), DictEnum.class);

    @Getter
    private static final Map<String, List<LabelValue>> enumMap = resolveAllDictEnums();

    /**
     * 通过value找enum
     */
    public static <T extends DictEnum> T getByValue(Object value, Class<T> enumClass) {
        for (T each : enumClass.getEnumConstants()) {
            if (each.getValue().equals(value)) {
                return each;
            }
        }
        return null;
    }

    /**
     * 通过value找enum
     */
    public static <T extends DictEnum> T getByLabel(Object label, Class<?> enumClass) {
        for (Object e : enumClass.getEnumConstants()) {
            if (e instanceof DictEnum<?> dictEnum && Objects.equals(dictEnum.getLabel(), label)) {
                return (T)dictEnum;
            }
        }
        return null;
    }

    private static Map<String, List<LabelValue>> resolveAllDictEnums() {
        Map<String, List<LabelValue>> enumMap = new HashMap<>();
        for (Class<?> enumClass : enumClassSet) {
            List<LabelValue> labelValues = listEnumDict(enumClass);
            enumMap.put(enumClass.getSimpleName(), labelValues);
        }
        return enumMap;
    }

    private static List<LabelValue> listEnumDict(Class<?> enumClass) {
        Object[] enumConstants = enumClass.getEnumConstants();
        return Arrays.stream(enumConstants).map(e -> new LabelValue((DictEnum)e)).filter(item -> !item.getDisabled()).toList();
    }

}
